﻿ namespace RuoTeng.Win32
{
    using System;
    using System.Runtime.InteropServices;

    class Message
    {      
        /// <summary>
        /// 【Win32 API】该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序，直到窗口程序处理完消息再返回。
        /// </summary>
        /// <param name="hWnd">
        ///             其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST，则消息将被发送到系统中所有顶层窗口，
        ///             包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口，但消息不被发送到子窗口
        /// </param>
        /// <param name="msg">指定被发送的消息</param>
        /// <param name="wParam">指定附加的消息指定信息</param>
        /// <param name="IParam">指定附加的消息指定信息</param>
        /// <returns>返回值指定消息处理的结果，依赖于所发送的消息</returns>
        [DllImport("user32.dll", EntryPoint= "SendMessage")]
        public static extern int SendMessage(IntPtr hWnd, uint msg, int wParam, IntPtr IParam);

        /// <summary>
        /// 【Win32 API】该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序，直到窗口程序处理完消息再返回。
        /// </summary>
        /// <param name="hWnd">
        ///             其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST，则消息将被发送到系统中所有顶层窗口，
        ///             包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口，但消息不被发送到子窗口
        /// </param>
        /// <param name="msg">指定被发送的消息</param>
        /// <param name="wParam">指定附加的消息指定信息</param>
        /// <param name="IParam">指定附加的消息指定信息</param>
        /// <returns>返回值指定消息处理的结果，依赖于所发送的消息</returns>
        [DllImport("user32.dll", EntryPoint= "SendMessage")]
        public static extern int SendMessage(IntPtr hWnd, uint msg, int wParam, int IParam);

        [DllImport("user32.dll", EntryPoint = "SendMessage")]
        public static extern int SendMessage(IntPtr hWnd, uint msg, int wParam, uint IParam);
        /// <summary>
        /// 【Win32 API】该函数将一个消息放入（寄送）到与指定窗口创建的线程相联系消息队列里，不等待线程处理消息就返回，是异步消息模式。
        ///             消息队列里的消息通过调用GetMessage和PeekMessage取得
        /// </summary>
        /// <param name="hWnd">
        ///             其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST，则消息将被发送到系统中所有顶层窗口，
        ///             包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口，但消息不被发送到子窗口
        /// </param>
        /// <param name="msg">指定被发送的消息</param>
        /// <param name="wParam">指定附加的消息指定信息</param>
        /// <param name="IParam">指定附加的消息指定信息</param>
        /// <returns>返回值指定消息处理的结果，依赖于所发送的消息</returns>
        [DllImport("user32.dll", EntryPoint= "PostMessage")]
        public static extern int PostMessage(IntPtr hWnd, uint msg, int wParam, IntPtr IParam);

        /// <summary>
        /// 【Win32 API】该函数将一个消息放入（寄送）到与指定窗口创建的线程相联系消息队列里，不等待线程处理消息就返回，是异步消息模式。
        ///             消息队列里的消息通过调用GetMessage和PeekMessage取得
        /// </summary>
        /// <param name="hWnd">
        ///             其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST，则消息将被发送到系统中所有顶层窗口，
        ///             包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口，但消息不被发送到子窗口
        /// </param>
        /// <param name="msg">指定被发送的消息</param>
        /// <param name="wParam">指定附加的消息指定信息</param>
        /// <param name="IParam">指定附加的消息指定信息</param>
        /// <returns>返回值指定消息处理的结果，依赖于所发送的消息</returns>
        [DllImport("user32.dll", EntryPoint= "PostMessage")]
        public static extern int PostMessage(IntPtr hWnd, uint msg, int wParam, int IParam);

        [DllImport("user32.dll", EntryPoint = "PostMessage")]
        public static extern int PostMessage(IntPtr hWnd, uint msg, int wParam, uint IParam);

        public enum VirtualKeys
        {
           VK_LBUTTON = 0x01,
           VK_RBUTTON = 0x02,
           VK_CANCEL  = 0x03,
           VK_MBUTTON = 0x04,
//#if(_WIN32_WINNT >= 0x0500)
           VK_XBUTTON1=0x05,
           VK_XBUTTON2=0x06, 
//#endif

/*
 * 0x07 : unassigned
 */        
           VK_BACK = 0x08,
           VK_TAB  = 0x09,
/*
 * 0x0A - 0x0B : reserved
 */
           VK_CLEAR = 0xC,
           VK_RETURN = 0x0D,
           VK_SHIFT = 0x10,
           VK_CONTROL = 0x11,
           VK_MENU = 0x12,
           VK_PAUSE = 0x13,
           VK_CAPITAL = 0x14,

           VK_KANA = 0x15,
           VK_HANGEUL = 0x15, /* old name - should be here for compatibility */
           VK_HANGUL = 0x15,
           VK_JUNJA = 0x17,
           VK_FINAL = 0x18,
           VK_HANJA = 0x19,
           VK_KANJI = 0x19,

           VK_ESCAPE = 0x1B,

           VK_CONVERT = 0x1C,
           VK_NONCONVERT = 0x1D,
           VK_ACCEPT = 0x1E,
           VK_MODECHANGE = 0x1F,

           VK_SPACE = 0x20,
           VK_PRIOR = 0x21,
           VK_NEXT = 0x22,
           VK_END = 0x23,
           VK_HOME = 0x24,
           VK_LEFT = 0x25,
           VK_UP = 0x26,
           VK_RIGHT = 0x27,
           VK_DOWN = 0x28,
           VK_SELECT = 0x29,
           VK_PRINT = 0x2A,
           VK_EXECUTE = 0x2B,
           VK_SNAPSHOT = 0x2C,
           VK_INSERT = 0x2D,
           VK_DELETE = 0x2E,
           VK_HELP = 0x2F,
/*
 * VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39)
 * 0x40 : unassigned
 * VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A)
 */
           VK_0 = 0x30,
           VK_1 = 0x31,
           VK_2 = 0x32,
           VK_3 = 0x33,
           VK_4 = 0x34,
           VK_5 = 0x35,
           VK_6 = 0x36,
           VK_7 = 0x37,
           VK_8 = 0x38,
           VK_9 = 0x39,

           VK_A = 0x41,
           VK_B = 0x42,
           VK_C = 0x43,
           VK_D = 0x44,
           VK_E = 0x45,
           VK_F = 0x46,
           VK_G = 0x47,
           VK_H = 0x48,
           VK_I = 0x49,
           VK_J = 0x4A,
           VK_K = 0x4B,
           VK_L = 0x4C,
           VK_M = 0x4D,
           VK_N = 0x4E,
           VK_O = 0x4F,
           VK_P = 0x50,
           VK_Q = 0x51,
           VK_R = 0x52,
           VK_S = 0x53,
           VK_T = 0x54,
           VK_U = 0x55,
           VK_V = 0x56,
           VK_W = 0x57,
           VK_X = 0x58,
           VK_Y = 0x59,
           VK_Z = 0x5A,

          VK_LWIN= 0x5B,
          VK_RWIN=0x5C,
          VK_APPS=0x5D,

          /*
 * 0x5E : reserved
 */

          VK_SLEEP = 0x5F,

          VK_NUMPAD0 = 0x60,
          VK_NUMPAD1 = 0x61,
          VK_NUMPAD2 = 0x62,
          VK_NUMPAD3 = 0x63,
          VK_NUMPAD4 = 0x64,
          VK_NUMPAD5 = 0x65,
          VK_NUMPAD6 = 0x66,
          VK_NUMPAD7 = 0x67,
          VK_NUMPAD8 = 0x68,
          VK_NUMPAD9 = 0x69,
          VK_MULTIPLY = 0x6A,
          VK_ADD = 0x6B,
          VK_SEPARATOR = 0x6C,
          VK_SUBTRACT = 0x6D,
          VK_DECIMAL = 0x6E,
          VK_DIVIDE = 0x6F,
          VK_F1 = 0x70,
          VK_F2 = 0x71,
          VK_F3 = 0x72,
          VK_F4 = 0x73,
          VK_F5 = 0x74,
          VK_F6 = 0x75,
          VK_F7 = 0x76,
          VK_F8 = 0x77,
          VK_F9 = 0x78,
          VK_F10 = 0x79,
          VK_F11 = 0x7A,
          VK_F12 = 0x7B,
          VK_F13 = 0x7C,
          VK_F14 = 0x7D,
          VK_F15 = 0x7E,
          VK_F16 = 0x7F,
          VK_F17 = 0x80,
          VK_F18 = 0x81,
          VK_F19 = 0x82,
          VK_F20 = 0x83,
          VK_F21 = 0x84,
          VK_F22 = 0x85,
          VK_F23 = 0x86,
          VK_F24 = 0x87,
        }
    }
}
